home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 August: Tool Chest / Dev.CD Aug 98 TC.toast / Sample Code / Overview / CPlusTESample / Document.cp < prev    next >
Encoding:
Text File  |  1994-11-18  |  5.2 KB  |  274 lines  |  [TEXT/MPS ]

  1. /*------------------------------------------------------------------------------------------
  2.  
  3.     Program:    CPlusTESample 2.0
  4.     File:        Document.cp
  5.     Uses:       Document.h
  6.  
  7.     by Andrew Shebanow
  8.     of Apple Macintosh Developer Technical Support
  9.  
  10.     Copyright © 1989-1990 Apple Computer, Inc.
  11.     All rights reserved.
  12.  
  13. ------------------------------------------------------------------------------------------*/
  14.  
  15. // Mac Includes
  16. #ifndef __TYPES__
  17. #include <Types.h>
  18. #endif
  19. #ifndef __QUICKDRAW__
  20. #include <QuickDraw.h>
  21. #endif
  22. #ifndef __FONTS__
  23. #include <Fonts.h>
  24. #endif
  25. #ifndef __EVENTS__
  26. #include <Events.h>
  27. #endif
  28. #ifndef __CONTROLS__
  29. #include <Controls.h>
  30. #endif
  31. #ifndef __WINDOWS__
  32. #include <Windows.h>
  33. #endif
  34. #ifndef __MENUS__
  35. #include <Menus.h>
  36. #endif
  37. #ifndef __TEXTEDIT__
  38. #include <TextEdit.h>
  39. #endif
  40. #ifndef __DIALOGS__
  41. #include <Dialogs.h>
  42. #endif
  43. #ifndef __MENUS__
  44. #include <Menus.h>
  45. #endif
  46. #ifndef __DEVICES__
  47. #include <Devices.h>
  48. #endif
  49. #ifndef __EVENTS__
  50. #include <Events.h>
  51. #endif
  52. #ifndef __SCRAP__
  53. #include <Scrap.h>
  54. #endif
  55. #ifndef __TOOLUTILS__
  56. #include <ToolUtils.h>
  57. #endif
  58. #ifndef __MEMORY__
  59. #include <Memory.h>
  60. #endif
  61. #ifndef __SEGLOAD__
  62. #include <SegLoad.h>
  63. #endif
  64. #ifndef __FILES__
  65. #include <Files.h>
  66. #endif
  67. #ifndef __OSUTILS__
  68. #include <OSUtils.h>
  69. #endif
  70. #ifndef __TRAPS__
  71. #include <Traps.h>
  72. #endif
  73. #ifndef __PACKAGES__
  74. #include <Packages.h>
  75. #endif
  76. #ifndef __ERRORS__
  77. #include <Errors.h>
  78. #endif
  79.  
  80. #include "Document.h"
  81.  
  82. //---------------------------------------------------------------------------------
  83.  
  84. TDocument::TDocument(short resID, OSType fileType)
  85. {
  86.     short wdRefNum, vRefNum;
  87.     long dirID;
  88.  
  89.     (void) GetVol(nil,&wdRefNum);
  90.     TApplication::WDToDirID(wdRefNum,vRefNum,dirID);
  91.     fFile.vRefNum = vRefNum;
  92.     fFile.dirID = dirID;
  93.     CopyPString(fFile.fileName,"\pUntitled");
  94.  
  95.     fFileRefNum = 0;
  96.     fNewDoc = true;
  97.     fReadOnly = false;
  98.     fDirty = false;
  99.     fFileType = fileType;
  100.     fActive = false;
  101.  
  102.     fDocWindow = GetNewWindow(resID,nil,(WindowPtr) -1);
  103.     SetPort(fDocWindow);
  104. }
  105.  
  106. TDocument::~TDocument()
  107. {
  108.     if (fFileRefNum != 0)
  109.       CloseFile();
  110.     DisposeWindow(fDocWindow);
  111. }
  112.  
  113. void TDocument::DoActivate(Boolean becomingActive)
  114. {
  115.     fActive = becomingActive;
  116. }
  117.  
  118. void TDocument::OpenFile(Boolean readOnly, Boolean createIfNecessary)
  119. {
  120.     short refNum;
  121.     char perm;
  122.     FInfo fndrInfo;
  123.  
  124.     // first, check if file exists
  125.     OSErr err = HGetFInfo(fFile.vRefNum,fFile.dirID,fFile.fileName,&fndrInfo);
  126.     if ((err == fnfErr) && createIfNecessary)
  127.       {
  128.         FailOSErr(HCreate(fFile.vRefNum,fFile.dirID,fFile.fileName,
  129.                       TApplication::GetCreator(),fFileType));
  130.       }
  131.     else FailOSErr(err);
  132.  
  133.     perm = (readOnly) ? fsRdPerm : fsRdWrPerm;
  134.     FailOSErr(HOpen(fFile.vRefNum, fFile.dirID,
  135.                     fFile.fileName, perm, &refNum));
  136.     fFileRefNum = refNum;
  137. }
  138.  
  139. void TDocument::CloseFile()
  140. {
  141.     if (fFileRefNum != 0)
  142.       {
  143.         FailOSErr(FSClose(fFileRefNum));
  144.         fFileRefNum = 0;
  145.       }
  146. }
  147.  
  148. void TDocument::OpenOldDoc(CanonicalFileSpec theFile, Boolean readOnly)
  149. {
  150.     fFile = theFile;
  151.     fFileRefNum = 0;
  152.     fNewDoc = false;
  153.     fReadOnly = readOnly;
  154.     fDirty = false;
  155.  
  156.     OpenFile(fReadOnly,false);
  157.     (void) SetFPos(fFileRefNum,fsFromStart,0);
  158.     ReadFromFile(fFileRefNum);
  159.  
  160.     SetWTitle(fDocWindow,fFile.fileName);
  161.     SetPort(fDocWindow);
  162. }
  163.  
  164. YNCResult TDocument::PresentSaveDialog(Boolean quitting)
  165. {
  166.     Str255 fileName;
  167.     Str255 buzzword;
  168.  
  169.     SetCursor(&qd.arrow);
  170.     CopyPString(fileName,fFile.fileName);
  171.     if (quitting)
  172.       GetIndString(buzzword,kBuzzwordStrings,bQuitting);
  173.     else GetIndString(buzzword,kBuzzwordStrings,bClosing);
  174.     ParamText(fileName, buzzword, "\p", "\p");
  175.     short item = Alert(rSaveAlert, (ModalFilterProcPtr) nil);
  176.     switch (item)
  177.       {
  178.         case 1:
  179.         default:
  180.             return yesResult;
  181.         case 2:
  182.             return noResult;
  183.         case 3:
  184.             return cancelResult;
  185.       }
  186. }
  187.  
  188. YNCResult TDocument::DoClose(Boolean askUserToSave, YNCResult defaultAnswer, Boolean quitting)
  189. {
  190.     YNCResult res;
  191.  
  192.     if (fDirty && askUserToSave)
  193.       res = PresentSaveDialog(quitting);
  194.     else res = defaultAnswer;
  195.     if (fDirty && (res == yesResult))
  196.       DoSave();
  197.     return res;
  198. }
  199.  
  200. void TDocument::DoSave()
  201. {
  202.     if (fNewDoc)
  203.       {
  204.         DoSaveAs();
  205.         return;
  206.       }
  207.  
  208.     if (!fDirty)
  209.       return;
  210.  
  211.     FailOSErr(SetFPos(fFileRefNum,fsFromStart,0));
  212.     FailOSErr(SetEOF(fFileRefNum,0));
  213.     WriteToFile(fFileRefNum);
  214.     fDirty = false;
  215. }
  216.  
  217. void TDocument::DoSaveAs()
  218. {
  219.     Point where;
  220.     Str255 prompt, origName;
  221.     SFReply reply;
  222.  
  223.     SetPt(&where,100,100);
  224.     CopyPString(origName,fFile.fileName);
  225.     prompt[0] = '\0';
  226.     SFPutFile(where, prompt, origName, NULL, &reply);
  227.     if (reply.good == false)
  228.       return;
  229.  
  230.     // close existing file, if any
  231.     if (fFileRefNum != 0)
  232.       CloseFile();
  233.  
  234.     // setup fields correctly
  235.     TApplication::WDToDirID(reply.vRefNum, fFile.vRefNum, fFile.dirID);
  236.     CopyPString(fFile.fileName, reply.fName);
  237.  
  238.     OpenFile(false,true);
  239.     SetWTitle(fDocWindow,fFile.fileName);
  240.  
  241.     FailOSErr(SetFPos(fFileRefNum,fsFromStart,0));
  242.     WriteToFile(fFileRefNum);
  243.  
  244.     fNewDoc = false;
  245.     fDirty = false;
  246. }
  247.  
  248. //---------------------------------------------------------------------------------
  249.  
  250. // find the TDocument associated with the window
  251. TDocument* TDocumentList::FindDoc(WindowPtr window)
  252. {
  253.     TDocument* tDoc;
  254.  
  255.     for (int idx = 0; idx < fNumObjs; idx++)
  256.       {
  257.         tDoc = (TDocument*) At(idx);
  258.         if (tDoc->GetDocWindow() == window)
  259.           return tDoc;
  260.       }
  261.     return nil;
  262. }
  263.  
  264. // private list management routines
  265. void TDocumentList::AddDoc(TDocument* doc)
  266. {
  267.     InsertFirst(doc);
  268. }
  269.  
  270. void TDocumentList::RemoveDoc(TDocument* doc)
  271. {
  272.     Remove(doc);
  273. }
  274.